<?php
/**
 * View
 * 
 * 模板解析类，调用其他模板引擎，方便扩展
 *
 * @author   songhuan <iphper@yeah.net>
 * @version   $Id: View.php 1 2010-08-10 14:40:00Z $
 */
class View implements ViewInterface
{
	private static $_instance = null;
	
	/**
	 * @var string 模板文件目录地址
	 */
	private $_template_dir = '';
	
	/**
	 * @var array 保存模板的值
	 */
	private $_tpl_vars = array();
	
	/**
	 * 初始化配置
	 */
	private function __construct()
	{
        $this->_template_dir = V::$config['view']['dir'] . DS . V::$config['view']['tpl_name'];
	}
	
    private function __clone() 
    {
    }
	
	public static function getInstance()
	{
		if (null === self::$_instance)
			self::$_instance = new self();

		return self::$_instance;
	}

	/**
     * 获取模板引擎
     *
     * @return View
     */
    public function getEngine()
    {
        return $this;
    }

    /**
     * 从 assign 过的值中获取一个变量
     *
     * @param  string $key
     * @return string|array|...
     */
    public function __get($key)
    {
    	if (array_key_exists($key, $this->_tpl_vars)) 
    		return $this->_tpl_vars[$key];
    	
    	return null;
    }

    /**
     * 判读是否 assign 过某个变量
     *
     * @param  string $key
     * @return boolean
     */
    public function __isset($key)
    {
    	return array_key_exists($key, $this->_tpl_vars);
    }

    /**
     * 向 assign 中设置一个变量
	 *
	 * @see assign()
     * @param string $key 变量名
     * @param mixed $value 变量值
     * @return void
     */
    public function __set($key, $value)
    {
    	$this->assign($key, $value);
    }

    /**
     * 从 assign 值中删除一个变量
     *
     * @param string $key
     * @return void
     */
    public function __unset($key)
    {
    	if (array_key_exists($key, $this->_tpl_vars)) 
    		unset($this->_tpl_vars[$key]);
    }

    /**
     * 向View中设置一个变量
     *
     * @see __set()
     * @param array|string $tpl_var 变量名
     * @param mixed $value $value 变量值
     */
    public function assign($tpl_var, $value = null)
    {
   		if (is_array($tpl_var))
		{
            foreach ($tpl_var as $key => $value) 
			{
                if ($key != '') 
                    $this->_tpl_vars[$key] = $value;
            }
        } 
		else 
		{
            if ($tpl_var != '')
                $this->_tpl_vars[$tpl_var] = $value;
        }
    }

    /**
     * 返回所有 assign 过的值
     *
     * @return array
     */
    public function getVars()
    {
    	return $this->_tpl_vars;
    }

    /**
     * 清空所有 assign 过的值
     *
     * @return void
     */
    public function clearVars()
    {
    	$this->_tpl_vars = array();
    }
    
    /**
     * 解析模板
     * 
     * @param $tplname 模板名称
     * @param $display 是否显示模板
     * @return void|string template_contents
     */
    public function fetch($tplname, $display = false)
    {
		$tplpath = $this->_template_dir . DS . $tplname;
		
    	extract($this->getVars());
		ob_start();
		include $tplpath;
		if (!$display)
		{
			$contents = ob_get_contents();
			ob_end_clean();
			return $contents;
		}
    }
    
    /**
     * 解析并显示模板
     * 
     * @param $tplname 模板名称
     * @param $display 是否显示模板
     */
    public function display($tplname)
    {
    	$this->fetch($tplname, true);
    } 
}
